package cn.hicard.risk.action.bd;

import java.io.File;
import java.io.FileOutputStream;
import java.io.FilenameFilter;
import java.util.ArrayList;
import java.util.List;

import org.apache.log4j.Logger;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;

import cn.hicard.risk.common.Constant;
import cn.hicard.risk.entity.BdBankcall;
import cn.hicard.risk.entity.BdCallorder;
import cn.hicard.risk.io.Fileinfo;
import cn.hicard.risk.service.bd.BankcallService;
import cn.hicard.util.AppConfig;
import cn.hicard.util.DateHelp;

public class BankcallUploadFlex {

	/** 日志记录工具 */
	private Logger logger = Logger.getLogger(Constant.LOGGER_MAIN);
	
	// 报文存放的相对目录	确保路径以'/'结尾
	private String datagramPath = "";
	/** 数据包文件扩展名 .ZIP*/
	public static final String PACKAGE_ZIP = ".ZIP";
	/** 报文文件扩展名 .XML*/
	public static final String DATAGRAM_XML = ".XML";
	/** 连接符 */
	public static final String JOINER = "_";
	
	/** 调单业务类 */
    private BankcallService bankcallService;
	
	public void setBankcallService(BankcallService bankcallService) {
		this.bankcallService = bankcallService;
	}
	
	/**
	 * 构造初始化
	 */
	public BankcallUploadFlex(){
		
		// 报文存放的相对目录	确保路径以'/'结尾
		this.datagramPath = AppConfig.get("bankcall_filedir");
		if(datagramPath.charAt(datagramPath.length()-1) != '/'){
			datagramPath += '/';
		}
		// 转为绝对路径 : classes -> WEB-INF -> /
		datagramPath = getClass().getResource("/../../").getPath() + datagramPath;
		datagramPath = datagramPath.replace("//", "/");
	}
	
	
	/**
	 * 取得调单附件的路径目录
	 * @return
	 */
	public String getImageCacheDir(){
		
		return AppConfig.get("bankcall_filedir");
		
	}
	
	/**
	 * 上传附件至服务器指定目录
	 * @param content
	 * @param callorder
	 * @return
	 */
	public String uploadImage(byte[] content, BdBankcall bankcall, String filename){
		// 附件名称
		String fileName = bankcall.getPkBankcall()+ "_" + DateHelp.dateNumber()+"_"+filename;
		// 目录		
		String cacheDir = AppConfig.get("bankcall_filedir");
		if(cacheDir.charAt(cacheDir.length()-1) != '/'){
			cacheDir += '/';
		}
		// 转为绝对路径
		cacheDir = getClass().getResource("/../../").getPath() + cacheDir;
		cacheDir = cacheDir.replace("//", "/");
		logger.debug("调单附件上传成功保存目录:" + cacheDir);
		// 文件输出流
		FileOutputStream fos = null;
		
		try {
			fos = new FileOutputStream(cacheDir + fileName);
			fos.write(content);
			fos.flush();
			logger.debug("附件上传成功");
		} catch (Exception e) {
			logger.error("", e);
		} finally {
			if(fos != null) {
				try{
					fos.close();
				}catch(Exception e){}
			}
		}
		
		return fileName;
	}

	/**
	 * 从服务器上删除附件
	 * @param callorder
	 * @return
	 */
	public String deleteImage(String fileName){
		String msg = "";
		logger.debug("删除附件开始……");
		
		//[start] 路径定位
		// 跟据类加载路径定位到项目目录
		String root = getClass().getResource("/../../").getPath();
		
		// 图片临时相对目录 // 确保路径末尾有一个'/'
		String cacheDir = AppConfig.get("bankcall_filedir");
		if(cacheDir.charAt(cacheDir.length()-1) != '/'){
			cacheDir += '/';
		}
		// 转为绝对路径
		cacheDir = root + cacheDir;
		cacheDir = cacheDir.replace("//", "/");
		
		// 图片保存相对目录 // 确保路径末尾有一个'/'
		String picdir = AppConfig.get("bankcall_filedir");
		if(picdir.charAt(picdir.length()-1) != '/'){
			picdir += '/';
		}
		// 转为绝对路径
		picdir = root + picdir;
		picdir = picdir.replace("//", "/");
		//[end] 路径定位
			
		String targetImg = cacheDir + "delete_" + fileName;//标记为已删除文件
		String deleteImg  = picdir + fileName;
		//logger.debug("模拟删除，准备将文件[" + deleteImg + "]移动到[" + targetImg + "]");
		File imageFile = new File(deleteImg);
		// 文件不存在，或路径是一个目录，则不充许删除
		if(  !  imageFile.exists() || imageFile.isDirectory()){ 
			msg = "附件文件不存在，无法删除";
		}else{
			imageFile.renameTo(new File(targetImg));
			try {
			
				msg = "删除附件成功！";
			} catch (Exception e) {
				msg = "删除附件时服务器出错:" + e.getMessage() + "\r\n请联系开发或运维人员" ;
				logger.error("", e);
			}
		}
		logger.debug(msg);
		return msg;
	}
	

	public String getFileList(final String bankcallId, final String type){
		String[] files = diskFiles(bankcallId, type);

		Element root = DocumentHelper.createElement("files");
		for (int i=0; i<files.length; i++) {
			String file = files[i];
			Element elt = root.addElement("file");
			elt.addAttribute("sequence", String.valueOf(i+1));
			//elt.addAttribute("date", date);
			elt.addAttribute("type", file.substring(file.indexOf('.')));
			elt.addAttribute("filename", file);
			elt.addAttribute("size", Fileinfo.sizeInfo(new File(datagramPath + file)));
		}
		String xml = root.asXML();
		logger.debug("生成FLEX数据源XML内容：\r\n" + xml);
		return xml;
	}
	
	/**
	 * 取得硬盘上文件
	 * @param date 文件的报送日期，从文件名中截取，格式yyyyMMdd
	 * @param type 文件类型是.XML还是.ZIP还是全部*
	 * @return
	 */
	private String[] diskFiles(final String bankcallId, final String type){
		return diskFiles(bankcallId, type, null);
	}
	
	/**
	 * 取得硬盘上已存的报文XML和ZIP文件
	 * @param date 文件的报送日期，从文件名中截取，格式yyyyMMdd
	 * @param type 文件类型是.XML还是.ZIP还是全部*
	 * @param batchno 批次号，即ZIP的序号和XML的包序号
	 * @return
	 */
	private String[] diskFiles(final String bankcallId, final String type, final String batchno){
		
		File dir = new File(datagramPath);
		String[] files = dir.list(new FilenameFilter() {			
			@Override
			public boolean accept(File dir, String name) {
   
			    //筛选出此调单对象对应的所有附件
				// 连接符坐标
				int index = name.indexOf(JOINER);
				// 连接符不正确
				if(index==-1) return false;
				
				if(bankcallId!=null){
                    //第一个连接符前面的串位调单对象ID号
					if(!bankcallId.equals(name.substring(0, index)))return false;
				}
				return true;
			}
		});
		return files;
	}
	
}
